pandasのデータフレーム


In [1]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame

2次元の array を DataFrame に変換する例です。


In [2]:
from numpy.random import randint
dices = randint(1,7,(5,2))
dices


Out[2]:
array([[5, 1],
       [2, 5],
       [6, 2],
       [5, 6],
       [2, 4]])

columns オプションで、各列の column 名を指定します。


In [3]:
diceroll = DataFrame(dices, columns=['dice1','dice2'])
diceroll


Out[3]:
dice1 dice2
0 5 1
1 2 5
2 6 2
3 5 6
4 2 4

Series オブジェクトから DataFrame を作成する例です。


In [4]:
city = Series(['Tokyo','Osaka','Nagoya','Okinawa'], name='City')
city


Out[4]:
0      Tokyo
1      Osaka
2     Nagoya
3    Okinawa
Name: City, dtype: object

In [5]:
temp = Series([25.0,28.2,27.3,30.9], name='Temperature')
temp


Out[5]:
0    25.0
1    28.2
2    27.3
3    30.9
Name: Temperature, dtype: float64

In [6]:
humid = Series([44,42,np.nan,62], name='Humidity')
humid


Out[6]:
0    44.0
1    42.0
2     NaN
3    62.0
Name: Humidity, dtype: float64

各列の column 名と対応する Series オブジェクトのディクショナリを与えて、DataFrame を生成します。


In [7]:
cities = DataFrame({'City':city, 'Temperature':temp, 'Humidity':humid})
cities


Out[7]:
City Humidity Temperature
0 Tokyo 44.0 25.0
1 Osaka 42.0 28.2
2 Nagoya NaN 27.3
3 Okinawa 62.0 30.9

Series オブジェクトの代わりに、リストから DataFrame を作成する例です。


In [8]:
data = {'City': ['Tokyo','Osaka','Nagoya','Okinawa'],
        'Temperature': [25.0,28.2,27.3,30.9],
        'Humidity': [44,42,np.nan,62]}
cities = DataFrame(data)
cities


Out[8]:
City Humidity Temperature
0 Tokyo 44.0 25.0
1 Osaka 42.0 28.2
2 Nagoya NaN 27.3
3 Okinawa 62.0 30.9

空の DataFrame に行を追加する例です。

はじめに、column 名だけを指定した DataFrame を作成します。


In [9]:
diceroll = DataFrame(columns=['dice1','dice2'])
diceroll


Out[9]:
dice1 dice2

対応するデータを Series オブジェクトとして用意します。この際、index オプションで column 名に対応する名前を付けておきます。


In [10]:
oneroll = Series(randint(1,7,2), index=['dice1','dice2'])
oneroll


Out[10]:
dice1    5
dice2    4
dtype: int64

用意した DataFrame の append メソッドで、Series オブジェクトを追加します。


In [11]:
diceroll = diceroll.append(oneroll, ignore_index=True)
diceroll


Out[11]:
dice1 dice2
0 5.0 4.0

2個のサイコロを 1000 回振った結果をシュミレーションする例です。


In [12]:
diceroll = DataFrame(columns=['dice1','dice2'])
for i in range(1000):
    diceroll = diceroll.append(
        Series(randint(1,7,2), index=['dice1','dice2']),
        ignore_index = True)
diceroll[:5]


Out[12]:
dice1 dice2
0 5.0 1.0
1 4.0 3.0
2 5.0 1.0
3 3.0 2.0
4 5.0 1.0

DataFrameのdescribeメソッドで、記法的な統計値を確認することができます。


In [13]:
diceroll.describe()


Out[13]:
dice1 dice2
count 1000.000000 1000.000000
mean 3.530000 3.450000
std 1.714071 1.708338
min 1.000000 1.000000
25% 2.000000 2.000000
50% 3.000000 3.000000
75% 5.000000 5.000000
max 6.000000 6.000000

DataFrame の append メソッドで、2つの DataFrame を結合する例です。


In [14]:
diceroll1 = DataFrame(randint(1,7,(5,2)),
                      columns=['dice1','dice2'])
diceroll1


Out[14]:
dice1 dice2
0 5 3
1 4 6
2 4 4
3 4 3
4 1 6

In [15]:
diceroll2 = DataFrame(randint(1,7,(3,2)),
                      columns=['dice1','dice2'])
diceroll2


Out[15]:
dice1 dice2
0 2 3
1 6 6
2 6 5

In [16]:
diceroll3 = diceroll1.append(diceroll2)
diceroll3


Out[16]:
dice1 dice2
0 5 3
1 4 6
2 4 4
3 4 3
4 1 6
0 2 3
1 6 6
2 6 5

ignore_index=True を指定すると、index は通し番号になるように再割当てが行われます。


In [17]:
diceroll4 = diceroll1.append(diceroll2, ignore_index=True)
diceroll4


Out[17]:
dice1 dice2
0 5 3
1 4 6
2 4 4
3 4 3
4 1 6
5 2 3
6 6 6
7 6 5

DataFrame に列を追加する例です。

配列の index 記法で、まだ存在しない column 名を指定すると、新しい列が用意されます。


In [18]:
diceroll = DataFrame()
diceroll['dice1'] = randint(1,7,5)
diceroll


Out[18]:
dice1
0 4
1 6
2 5
3 1
4 6

In [19]:
diceroll['dice2'] = randint(1,7,5)
diceroll


Out[19]:
dice1 dice2
0 4 4
1 6 2
2 5 1
3 1 4
4 6 3

pd.concat 関数で複数の Series を列として結合できます。(axis=1 は列方向での結合を意味します。)


In [20]:
dice1 = Series(randint(1,7,5),name='dice1')
dice2 = Series(randint(1,7,5),name='dice2')
diceroll = pd.concat([dice1, dice2], axis=1)
diceroll


Out[20]:
dice1 dice2
0 6 1
1 6 4
2 5 6
3 5 3
4 5 6

pd.concat 関数で既存の DataFrame に Series を追加することもできます。


In [21]:
dice3 = Series(randint(1,7,5),name='dice3')
diceroll = pd.concat([diceroll, dice3], axis=1)
diceroll


Out[21]:
dice1 dice2 dice3
0 6 1 2
1 6 4 3
2 5 6 4
3 5 3 3
4 5 6 2

練習問題

(1) 0≦x≦1の範囲を等分した num 個の点ついて、「sin(2πx) + 正規分布の乱数(平均0, 標準偏差0.3)」を計算した array を返す関数 create_dataset(num) を作成してください。

from numpy.random import normal def create_dataset(num): # この部分のコードを作成すること。 return data_y

(2) (1)の関数について、xの値と、対応する「y = sin(2πx) + 正規分布の乱数(平均0, 標準偏差0.3)」の値を列に持つDataFrameを返すように修正してください。(列の名前は、それぞれ 'x' および 'y' とします。)

例えば、次のような実装方法が考えられます。複数の方法を試してみてください。

  • 列'x'と列'y'に対応するarrayオブジェクト data_x, data_y を用意した後、これらを列に持つDataFrameを定義する。(ディクショナリー形式のオプションで列を指定する。)
  • 列'x'と列'y'に対応するarrayオブジェクト data_x, data_y を用意した後、空のDataFrameを作成して、df['x']=data_x のように列名指定でデータを追加する。
  • 列'x'と列'y'を個別のSeriesオブジェクトとして作成した後、pd.concat()で結合する。

(3) (2)の関数を用いて、num=1000 のデータフレームを作成した後、describe()メソッドでデータの統計情報を確認してください。